package 炫彩元素类

import (
	xc "gitee.com/go_888/xcgui/xcgui/xc"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
)

// X结构_月历 月历卡片.
type X结构_月历 struct {
	X结构_基础元素
}

// 月历_创建, 创建日期时间元素.
//
// x: x坐标.
//
// y: y坐标.
//
// cx: 宽度.
//
// cy: 高度.
//
// hParent: 父为窗口句柄或元素句柄.
func X创建月历(x坐标, y坐标, 宽度, 高度 int32, 父窗口句柄 int) *X结构_月历 {
	p := &X结构_月历{}
	p.X设置句柄(xc.X月历_创建(x坐标, y坐标, 宽度, 高度, 父窗口句柄))
	return p
}

// 从句柄创建对象.
func X创建月历并按句柄(句柄 int) *X结构_月历 {
	p := &X结构_月历{}
	p.X设置句柄(句柄)
	return p
}

// 从name创建对象, 失败返回nil.
func X创建月历并按名称(名称 string) *X结构_月历 {
	handle := xc.X取对象并按名称(名称)
	if handle > 0 {
		p := &X结构_月历{}
		p.X设置句柄(handle)
		return p
	}
	return nil
}

// 从UID创建对象, 失败返回nil.
func X创建月历并按UID(UID int32) *X结构_月历 {
	handle := xc.X取对象并按UID(UID)
	if handle > 0 {
		p := &X结构_月历{}
		p.X设置句柄(handle)
		return p
	}
	return nil
}

// 从UID名称创建对象, 失败返回nil.
func X创建月历并按UID名称(名称 string) *X结构_月历 {
	handle := xc.X取对象并按UID名称(名称)
	if handle > 0 {
		p := &X结构_月历{}
		p.X设置句柄(handle)
		return p
	}
	return nil
}

// 月历_取内部按钮, 获取内部按钮元素.
//
// nType: 按钮类型, MonthCal_Button_Type_.
func (m *X结构_月历) X取内部按钮(按钮类型 xcc.X月历按钮类型) int {
	return xc.X月历_取内部按钮(m.X句柄, 按钮类型)
}

// 月历_置当前日期, 设置月历选中的年月日.
//
// nYear: 年.
//
// nMonth: 月.
//
// nDay: 日.
func (m *X结构_月历) X设置当前日期(年 int32, 月 int32, 日 int32) *X结构_月历 {
	xc.X月历_设置当前日期(m.X句柄, 年, 月, 日)
	return m
}

// 月历_取当前日期, 获取月历当前年月日.
//
// pnYear: 年.
//
// pnMonth: 月.
//
// pnDay: 日.
func (m *X结构_月历) X取当前日期(返回年 *int32, 返回月 *int32, 返回日 *int32) *X结构_月历 {
	xc.X月历_取当前日期(m.X句柄, 返回年, 返回月, 返回日)
	return m
}

// 月历_取当前日期Ex, 获取月历当前年月日.
func (m *X结构_月历) GetTodayEx() (year int32, month int32, day int32) {
	var pnYear, pnMonth, pnDay int32
	xc.X月历_取当前日期(m.X句柄, &pnYear, &pnMonth, &pnDay)
	return pnYear, pnMonth, pnDay
}

// 月历_取选择日期, 获取月历选中的年月日.
//
// pnYear: 年.
//
// pnMonth: 月.
//
// pnDay: 日.
func (m *X结构_月历) X取选择日期(返回年 *int32, 返回月 *int32, 返回日 *int32) *X结构_月历 {
	xc.X月历_取选择日期(m.X句柄, 返回年, 返回月, 返回日)
	return m
}

// 月历_取选择日期Ex, 获取月历选中的年月日.
func (m *X结构_月历) GetSelDateEx() (year int32, month int32, day int32) {
	var pnYear, pnMonth, pnDay int32
	xc.X月历_取选择日期(m.X句柄, &pnYear, &pnMonth, &pnDay)
	return pnYear, pnMonth, pnDay
}

// 月历_置文本颜色.
//
// nFlag: 1:周六, 周日文字颜色, 2:日期文字的颜色; 其它周文字颜色, 使用元素自身颜色.
//
// color: xc.RGBA 颜色值.
func (m *X结构_月历) X设置文本颜色(类型 int32, ABGR颜色值 int) *X结构_月历 {
	xc.X月历_设置文本颜色(m.X句柄, 类型, ABGR颜色值)
	return m
}

// ------------------------- 事件 ------------------------- //

type X事件_月历_日期改变 func(pbHandled *bool) int            // 月历元素日期改变事件.
type X事件_月历_日期改变1 func(hEle int, pbHandled *bool) int // 月历元素日期改变事件.

// 月历元素日期改变事件.
func (m *X结构_月历) X事件_日期改变(回调函数 X事件_月历_日期改变) bool {
	return xc.X元素_注册事件C(m.X句柄, xcc.X元素事件_月历_日期改变, 回调函数)
}

// 月历元素日期改变事件.
func (m *X结构_月历) X事件_日期改变1(回调函数 X事件_月历_日期改变1) bool {
	return xc.X元素_注册事件C1(m.X句柄, xcc.X元素事件_月历_日期改变, 回调函数)
}

// ------------------------- AddEvent ------------------------- //

// AddEvent_MonthCal_Change 添加月历元素日期改变事件.
//
// pFun: 回调函数.
//
// allowAddingMultiple: 允许添加多个回调函数.
func (m *X结构_月历) AddEvent_MonthCal_Change(pFun X事件_月历_日期改变1, allowAddingMultiple ...bool) int {
	return EventHandler.AddCallBack(m.X句柄, xcc.X元素事件_月历_日期改变, onXE_MONTHCAL_CHANGE, pFun, allowAddingMultiple...)
}

// onXE_MONTHCAL_CHANGE 月历元素日期改变事件.
func onXE_MONTHCAL_CHANGE(hEle int, pbHandled *bool) int {
	cbs := EventHandler.GetCallBacks(hEle, xcc.X元素事件_月历_日期改变)
	var ret int
	for i := len(cbs) - 1; i >= 0; i-- {
		if cbs[i] != nil {
			ret = cbs[i].(X事件_月历_日期改变1)(hEle, pbHandled)
			if *pbHandled {
				break
			}
		}
	}
	return ret
}
